Function.prototype.newBind = function(context, ...args) {
  let self = this;
  let fNOP = function () {};
  let fBound = function(...bindArgs) {
    // 当作为构造函数时，this 指向实例(因为下方设置了fBound.prototype = self.prototype)，此时结果为 true，将绑定函数的 this 指向该实例，可以让实例获得来自绑定函数的值
    // 当作为普通函数时，this 指向 window，此时结果为 false，将绑定函数的 this 指向 context
    return self.apply(this instanceof fNOP ? this : context,  [...args, ...bindArgs])

  }
  
  fNOP.prototype = this.prototype // 继承绑定函数的原型
  fBound.prototype = new fNOP()
  
  return fBound
}